/* SASAbusHTML5 - HTML5 App for SASA bus Copyright (C) 2013 TIS Innovation Park - Bolzano/Bozen - Italy This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package it.bz.tis.sasabus.html5.client; import it.bz.tis.sasabus.backend.shared.AreaList; import it.bz.tis.sasabus.backend.shared.BusTripStopList; import it.bz.tis.sasabus.backend.shared.FreeSlots; import it.bz.tis.sasabus.backend.shared.NewsList; import it.bz.tis.sasabus.backend.shared.ParkingInfo; import it.bz.tis.sasabus.backend.shared.SASAbusBackendUnmarshaller; import it.bz.tis.sasabus.backend.shared.SASAbusDB; import it.bz.tis.sasabus.backend.shared.SASAbusDBDataReady; import it.bz.tis.sasabus.backend.shared.SASAbusDBLastModified; import it.bz.tis.sasabus.backend.shared.travelplanner.ConRes; import bz.davide.dmweb.shared.view.AbstractHtmlElementView; import bz.davide.dmxmljson.unmarshalling.json.gwt.GWTStructure; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.json.client.JSONObject; import com.google.gwt.jsonp.client.JsonpRequestBuilder; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; /** * @author Davide Montesin <d@vide.bz> */ public class SASAbusDBClientImpl implements SASAbusDB { public static SASAbusDB singleton = null; String serviceBaseUrl; public SASAbusDBClientImpl(String serviceBaseUrl) { super(); this.serviceBaseUrl = serviceBaseUrl; } @Override public void loadNews(SASAbusDBDataReady<NewsList> response) { this.connect("news?nocache=" + System.currentTimeMillis(), "NewsList", response); } @Override public void loadParkingInfo(String parkingid, SASAbusDBDataReady<ParkingInfo> response) { this.connect("parking/getParkingStation?identifier=" + parkingid + "&nocache=" + System.currentTimeMillis(), "ParkingInfo", response); } @Override public void loadParkingFreeSlots(String parkingid, SASAbusDBDataReady<FreeSlots> response) { this.connect("parkingfreeslots/getNumberOfFreeSlots?identifier=" + parkingid + "&nocache=" + System.currentTimeMillis(), "FreeSlots", response); } @Override public void lastModified(SASAbusDBDataReady<SASAbusDBLastModified> response) { this.connect("sasabusdb/lastModified?nocache=" + System.currentTimeMillis(), "SASAbusDBLastModified", response); } @Override public void listBusAreasLinesStopsStations(final SASAbusDBDataReady<AreaList> response) { SASAbusDBClientImpl.this.connect("sasabusdb/listBusAreasLinesStopsStations", "AreaList", response); } @Override public void findBusStationDepartures(String busStationId, long yyyymmddhhmm, SASAbusDBDataReady<BusTripStopList> response) { this.connect("sasabusdb/findBusStationDepartures?busStationId=" + busStationId + "&yyyymmddhhmm=" + yyyymmddhhmm, "BusTripStopList", response); } @Override public void calcRoute(String startBusStationId, String endBusStationId, long yyyymmddhhmm, SASAbusDBDataReady<ConRes> response) throws Exception { this.connect("sasabusdb/calcRoute?startBusStationId=" + startBusStationId + "&endBusStationId=" + endBusStationId + "&yyyymmddhhmm=" + yyyymmddhhmm, "ConRes", response); } @Override public void nextRoute(String context, SASAbusDBDataReady<ConRes> response) throws Exception { this.connect("sasabusdb/nextRoute?context=" + AbstractHtmlElementView.escapeText4url(context), "ConRes", response); } private <T> void connect(String methodUri, final String unmarshallerRootClassSimpleName, final SASAbusDBDataReady<T> callback) { final int i[] = new int[] { 0 }; final long[] times = new long[6]; times[i[0]++] = System.currentTimeMillis(); JsonpRequestBuilder jsonpRequestBuilder = new JsonpRequestBuilder(); jsonpRequestBuilder.requestObject(this.serviceBaseUrl + methodUri, new AsyncCallback<JavaScriptObject>() { @Override public void onSuccess(JavaScriptObject result) { times[i[0]++] = System.currentTimeMillis(); SASAbusBackendUnmarshaller unmarshaller = new SASAbusBackendUnmarshaller(); times[i[0]++] = System.currentTimeMillis(); JSONObject jsonObject = new JSONObject(result); GWTStructure gwtStructure = new GWTStructure(jsonObject); try { times[i[0]++] = System.currentTimeMillis(); Object obj = unmarshaller.newInstance(unmarshallerRootClassSimpleName); times[i[0]++] = System.currentTimeMillis(); unmarshaller.unmarschall(gwtStructure, obj); times[i[0]++] = System.currentTimeMillis(); String report = ""; for (int k = 0; k < times.length - 1; k++) { report += "Time " + k + ": " + (times[k + 1] - times[k]) + "\n"; } callback.ready((T) obj); } catch (Exception e) { this.onFailure(e); } } @Override public void onFailure(Throwable caught) { caught.printStackTrace(); Window.alert("ko contacting server: " + caught.getClass().getName() + " - " + caught.getMessage()); } }); } }